package pl.marekbar;

import java.io.File;
import java.io.FileOutputStream;

import pl.marekbar.Gesty.GestySluchacz;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

/**
 * Wyświetla obraz widziany przez kamerę i robi zdjęcie na dotknięie.
 * Działa w trybie pełnoekranowym. Kamera jest obsługiwana sprzętowo.
 * 
 * @author marekbar1985
 * 
 */
public class KameraWidok extends Activity implements SurfaceHolder.Callback,
		GestySluchacz, OnClickListener
{
	private static final int ID_PODGLADU = 1349218;
	public static int KOD_NIEPOWODZENIE = 777;
	public static int KOD_POWODZENIE = 666;
	public static String SZEROKOSC = "szerokosc";
	public static String WYSOKOSC = "wyysokosc";
	public static String OZNACZENIE_ZDJECIA = "zdjęcie";
	private boolean czyPodgladWlaczony = false;
	private Gesty detektor = null;
	private final int KTORA_KAMERA = 0;
	private boolean blokuj = false;

	Camera.PictureCallback funkcjaZwrotnaPodgladu = new Camera.PictureCallback()
	{
		@Override
		public void onPictureTaken(byte[] dane, Camera camera)
		{
			blokuj = true;
			if (dane != null)
			{
				Intent zamiar = new Intent();

				Camera.Parameters parametryKamery = kamera.getParameters();
				Camera.Size rozmiar = parametryKamery
						.getSupportedPreviewSizes().get(KTORA_KAMERA);
				int szerokosc = rozmiar.width;
				int wysokosc = rozmiar.height;

				zamiar.putExtra(KameraWidok.OZNACZENIE_ZDJECIA,
						zapiszZdjecieTymczasowo(dane, szerokosc, wysokosc));

				kamera.stopPreview();
				czyPodgladWlaczony = false;
				kamera.release();
				setResult(KameraWidok.KOD_POWODZENIE, zamiar);
				finish();
			}
		}
	};
	private Camera kamera;
	private SurfaceView podglad;
	private SurfaceHolder podgladUchwyt;



	@Override
	public boolean dispatchTouchEvent(MotionEvent zdarzenie)
	{
		this.detektor.onTouchEvent(zdarzenie);
		return super.dispatchTouchEvent(zdarzenie);
	}



	private void mapujWidok()
	{
		podglad = (SurfaceView) findViewById(ID_PODGLADU);
		podglad.setOnClickListener(KameraWidok.this);
		podgladUchwyt = podglad.getHolder();
		podgladUchwyt.addCallback(KameraWidok.this);
		podgladUchwyt.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}



	@Override
	public void onClick(View v)
	{
		if (!this.blokuj)
		{
			kamera.takePicture(null, funkcjaZwrotnaPodgladu,
					funkcjaZwrotnaPodgladu);
		}
	}



	public void onCreate(Bundle paczka)
	{
		super.onCreate(paczka);
		this.wlaczPelnyEkran();
		setContentView(this.utworzWyglad());
		this.mapujWidok();
		detektor = new Gesty(this, this);
	}



	@Override
	public void onPodwojneDotkniecie()
	{

	}



	@Override
	public void onPrzesuniecie(int kierunek)
	{

	}



	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState)
	{
		super.onRestoreInstanceState(savedInstanceState);
	}



	protected void onResume()
	{
		super.onResume();
	}



	protected void onSaveInstanceState(Bundle outState)
	{
		super.onSaveInstanceState(outState);
	}



	protected void onStop()
	{
		super.onStop();
	}



	public void surfaceChanged(SurfaceHolder uchwytPodgladu, int format, int w,
			int h)
	{
		if (czyPodgladWlaczony)
		{
			kamera.stopPreview();
		}

		Camera.Parameters parametryKamery = kamera.getParameters();
		Camera.Size rozmiar = parametryKamery.getSupportedPreviewSizes().get(
				KTORA_KAMERA);

		parametryKamery.setPreviewSize(rozmiar.width, rozmiar.height);
		kamera.setDisplayOrientation(90);
		kamera.setParameters(parametryKamery);
		try
		{
			kamera.setPreviewDisplay(uchwytPodgladu);
		}
		catch (Exception wyjatek)
		{
			Aplikacja.blad(wyjatek.getMessage());
		}
		kamera.startPreview();
		czyPodgladWlaczony = true;
	}



	public void surfaceCreated(SurfaceHolder holder)
	{
		kamera = Camera.open();
	}



	@Override
	public void surfaceDestroyed(SurfaceHolder uchwytPodgladu)
	{
		if (czyPodgladWlaczony)
		{
			kamera.stopPreview();
			czyPodgladWlaczony = false;
			kamera.release();
		}
	}



	private View utworzWyglad()
	{
		LinearLayout wyglad = new LinearLayout(KameraWidok.this);
		LayoutParams parametryWygladu = new LayoutParams(
				LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
		wyglad.setLayoutParams(parametryWygladu);
		wyglad.setOrientation(LinearLayout.HORIZONTAL);
		SurfaceView podglad = new SurfaceView(KameraWidok.this);
		podglad.setLayoutParams(parametryWygladu);
		podglad.setId(ID_PODGLADU);
		wyglad.addView(podglad);
		return wyglad;
	}



	private void wlaczPelnyEkran()
	{
		getWindow().setFormat(PixelFormat.TRANSLUCENT);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
	}



	private String zapiszZdjecieTymczasowo(byte[] dane, int szerokosc,
			int wysokosc)
	{
		File folder = Aplikacja.pobierzKatalogZdjec();
		String sciezkaPliku = folder.getAbsolutePath() + "/"
				+ Aplikacja.generujNazwe() + ".png";

		BitmapFactory.Options opts = new BitmapFactory.Options();
		Bitmap bitmapa = BitmapFactory.decodeByteArray(dane, 0, dane.length,
				opts);
		bitmapa = Bitmap
				.createScaledBitmap(bitmapa, szerokosc, wysokosc, false);
		Matrix macierz = new Matrix();
		macierz.postRotate(90);

		Bitmap bitmapaPoObrocie = Bitmap.createBitmap(bitmapa, 0, 0, szerokosc,
				wysokosc, macierz, true);
		bitmapa.recycle();
		bitmapa = null;
		try
		{
			FileOutputStream plik = new FileOutputStream(sciezkaPliku);
			bitmapaPoObrocie.compress(Bitmap.CompressFormat.PNG, 90, plik);
			plik.flush();
			plik.close();
			bitmapaPoObrocie.recycle();
			bitmapaPoObrocie = null;
		}
		catch (Exception e)
		{
			Aplikacja.blad(e.getMessage());
		}
		return sciezkaPliku;
	}
}
